package com.softer.chengxin.excel.dao;

import com.softer.chengxin.common.domin.Page;
import com.softer.chengxin.excel.dao.provider.ExcelProvider;
import com.softer.chengxin.excel.domin.ExcelExportRecordVO;
import com.softer.chengxin.excel.domin.MenuDTO;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author Wang Xinrui
 * @date 2019/1/10
 */
@Mapper
@Repository
public interface ExcelDao {

    /**
     * 获取报表列表
     *
     * @param loginName 登录名
     * @param page      页码
     * @param excelName 报表名
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listExcels")
    List<ExcelExportRecordVO> listExcels(@Param("loginName") String loginName,
                                         @Param("page") Page page,
                                         @Param("excelName") String excelName,
                                         @Param("excelType") String excelType);

    /**
     * excel记录详细
     *
     * @param id id
     * @return 结果
     */
    @Select("select id,excel_name as excelName,excelStr,excelObj,type,adder,gmt_create as gmtCreate,gmt_modified as gmtModified from excel_export_record where id=#{id}")
    ExcelExportRecordVO excelDetail(@Param("id") Integer id);

    /**
     * 删除excel记录
     *
     * @param id id
     * @return 结果
     */
    @Delete("delete from excel_export_record where id=#{id}")
    int deleteExcel(@Param("id") Integer id);

    /**
     * 新增导出报表记录
     *
     * @param excelExportRecordVO 参数
     * @return 结果集
     */
    @Insert("insert into excel_export_record(excel_name,excelStr,excelObj,type,adder,gmt_create,gmt_modified,excel_type,excel_str_name) " +
            "values(#{r.excelName},#{r.excelStr},#{r.excelObj},#{r.type},#{r.adder},now(),now(),#{r.excelType},#{r.excelStrName})")
    int insertExcelRecord(@Param("r") ExcelExportRecordVO excelExportRecordVO);

    /**
     * 修改报表记录
     *
     * @param excelExportRecordVO 参数
     * @return 结果集
     */
    @Update("update excel_export_record set excel_name=#{r.excelName},excelStr=#{r.excelStr}," +
            "excelObj=#{r.excelObj},type=#{r.type},adder=#{r.adder},gmt_modified=now() where id=#{r.id}")
    int updateExcelRecord(@Param("r") ExcelExportRecordVO excelExportRecordVO);

    /**
     * 获取报表列表 数量
     *
     * @param loginName 登录名
     * @param excelName 报表名
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countExcel")
    int countExcel(@Param("loginName") String loginName,
                   @Param("excelName") String excelName,
                   @Param("excelType") String excelType);

    /**
     * 获取excel页面字段
     *
     * @param parentId 父级id
     * @return 结果
     */
    @Select("select id,menu_name as menuName,parent_id as parentId,`name` " +
            "from menu where parent_id=#{parentId}")
    List<MenuDTO> listMenus(@Param("parentId") Integer parentId);

    /**
     * 通过字段名name查找menu
     *
     * @param name     字段名
     * @param parentId parentId
     * @return 结果集
     */
    @Select("select id,menu_name as menuName,parent_id as parentId,`name` " +
            "from menu where parent_id=#{parentId} and `name`=#{name}")
    MenuDTO getMenuByName(@Param("name") String name,
                          @Param("parentId") Integer parentId);

    /**
     * 导出企业信息 数据
     *
     * @param qyName          企业名
     * @param district        地区
     * @param fields          字段名集合
     * @param page            页码
     * @param area            该管理账号所管理区域
     * @param registerAddress 注册地
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listCorps")
    List<Map<String, Object>> listCorps(@Param("qyName") String qyName,
                                        @Param("district") Integer district,
                                        @Param("fields") String[] fields,
                                        @Param("page") Page page,
                                        @Param("area") String area,
                                        @Param("registerAddress") String registerAddress,
                                        @Param("street") String street,
                                        @Param("beginTime") String beginTime,
                                        @Param("endTime") String endTime);

    /**
     * 导出企业信息 数据数量
     *
     * @param qyName          企业名
     * @param district        地区
     * @param area            该管理账号所管理区域
     * @param registerAddress 注册地
     * @param street          街道
     * @param beginTime       开始时间
     * @param endTime         结束时间
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countCorp")
    int countCorp(@Param("qyName") String qyName,
                  @Param("district") Integer district,
                  @Param("area") String area,
                  @Param("registerAddress") String registerAddress,
                  @Param("street") String street,
                  @Param("beginTime") String beginTime,
                  @Param("endTime") String endTime);

    /**
     * 导出企业人员信息数据
     *
     * @param fields      字段集合
     * @param district    所在区
     * @param qyName      企业名
     * @param page        页码
     * @param insurance   是否缴纳五险一金
     * @param certificate 是否是中级以上职称
     * @param duties      职务
     * @param area        该管理账号所管理区域
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listCorpPersons")
    List<Map<String, Object>> listCorpPersons(@Param("fields") String[] fields,
                                              @Param("district") Integer district,
                                              @Param("qyName") String qyName,
                                              @Param("page") Page page,
                                              @Param("insurance") String insurance,
                                              @Param("certificate") String certificate,
                                              @Param("duties") String duties,
                                              @Param("area") String area,
                                              @Param("street") String street,
                                              @Param("beginTime") String beginTime,
                                              @Param("endTime") String endTime);

    /**
     * 导出企业人员信息数据 数量
     *
     * @param district    所在区
     * @param qyName      企业名
     * @param insurance   是否缴纳五险一金
     * @param certificate 是否是中级以上职称
     * @param duties      职务
     * @param area        该管理账号所管理区域
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countCorpPerson")
    int countCorpPerson(@Param("district") Integer district,
                        @Param("qyName") String qyName,
                        @Param("insurance") String insurance,
                        @Param("certificate") String certificate,
                        @Param("duties") String duties,
                        @Param("area") String area,
                        @Param("street") String street,
                        @Param("beginTime") String beginTime,
                        @Param("endTime") String endTime);

    /**
     * 企业年度综合评级数据
     *
     * @param fields 字段集合
     * @param qyName 企业名
     * @param page   页码
     * @param area   该账号所管理区域
     * @param dj     等级
     * @param year   年度
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listCorpRecords")
    List<Map<String, Object>> listCorpRecords(@Param("fields") String[] fields,
                                              @Param("qyName") String qyName,
                                              @Param("page") Page page,
                                              @Param("area") String area,
                                              @Param("dj") String dj,
                                              @Param("year") String year,
                                              @Param("street") String street,
                                              @Param("beginTime") String beginTime,
                                              @Param("endTime") String endTime,
                                              @Param("district") Integer district);

    /**
     * 企业年度综合评级数据 数量
     *
     * @param qyName 企业名
     * @param area   该账号所管理区域
     * @param dj     等级
     * @param year   年度
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countCorpRecord")
    int countCorpRecord(@Param("qyName") String qyName,
                        @Param("area") String area,
                        @Param("dj") String dj,
                        @Param("year") String year,
                        @Param("street") String street,
                        @Param("beginTime") String beginTime,
                        @Param("endTime") String endTime,
                        @Param("district") Integer district);


    /**
     * 获取项目信息数据
     *
     * @param fields   字段集合
     * @param qyName   企业名
     * @param area     账号管理区域
     * @param page     页码
     * @param proName  项目名
     * @param district 所在区
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listProjects")
    List<Map<String, Object>> listProjects(@Param("fields") String[] fields,
                                           @Param("qyName") String qyName,
                                           @Param("area") String area,
                                           @Param("page") Page page,
                                           @Param("proName") String proName,
                                           @Param("district") Integer district,
                                           @Param("street") String street,
                                           @Param("beginTime") String beginTime,
                                           @Param("endTime") String endTime);

    /**
     * 获取项目信息数据 数量
     *
     * @param qyName   企业名
     * @param area     账号管理区域
     * @param proName  项目名
     * @param district 所在区
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countProject")
    int countProject(@Param("qyName") String qyName,
                     @Param("area") String area,
                     @Param("proName") String proName,
                     @Param("district") Integer district,
                     @Param("street") String street,
                     @Param("beginTime") String beginTime,
                     @Param("endTime") String endTime);

    /**
     * 项目人员信息数据
     *
     * @param fields  字段集合
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @param page    页码
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listProjectPersons")
    List<Map<String, Object>> listProjectPersons(@Param("fields") String[] fields,
                                                 @Param("qyName") String qyName,
                                                 @Param("proName") String proName,
                                                 @Param("area") String area,
                                                 @Param("page") Page page,
                                                 @Param("district") Integer district,
                                                 @Param("street") String street,
                                                 @Param("beginTime") String beginTime,
                                                 @Param("endTime") String endTime);

    /**
     * 项目人员信息数据 数量
     *
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countProjectPerson")
    int countProjectPerson(@Param("qyName") String qyName,
                           @Param("proName") String proName,
                           @Param("area") String area,
                           @Param("district") Integer district,
                           @Param("street") String street,
                           @Param("beginTime") String beginTime,
                           @Param("endTime") String endTime);

    /**
     * 项目物业用房信息数据
     *
     * @param fields  字段集合
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @param page    页码
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listProjectHouses")
    List<Map<String, Object>> listProjectHouses(@Param("fields") String[] fields,
                                                @Param("qyName") String qyName,
                                                @Param("proName") String proName,
                                                @Param("area") String area,
                                                @Param("page") Page page,
                                                @Param("street") String street,
                                                @Param("beginTime") String beginTime,
                                                @Param("endTime") String endTime,
                                                @Param("district") Integer district);

    /**
     * 项目物业用房信息数据 数量
     *
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countProjectHouse")
    int countProjectHouse(@Param("qyName") String qyName,
                          @Param("proName") String proName,
                          @Param("area") String area,
                          @Param("street") String street,
                          @Param("beginTime") String beginTime,
                          @Param("endTime") String endTime,
                          @Param("district") Integer district);

    /**
     * 业主委员会信息数据
     *
     * @param fields  字段集合
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @param page    页码
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listProprietors")
    List<Map<String, Object>> listProprietors(@Param("fields") String[] fields,
                                              @Param("qyName") String qyName,
                                              @Param("proName") String proName,
                                              @Param("area") String area,
                                              @Param("page") Page page,
                                              @Param("street") String street,
                                              @Param("beginTime") String beginTime,
                                              @Param("endTime") String endTime,
                                              @Param("district") Integer district);

    /**
     * 业主委员会信息数据数量
     *
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countProprietor")
    int countProprietor(@Param("qyName") String qyName,
                        @Param("proName") String proName,
                        @Param("area") String area,
                        @Param("street") String street,
                        @Param("beginTime") String beginTime,
                        @Param("endTime") String endTime,
                        @Param("district") Integer district);

    /**
     * 项目经营状况信息数据
     *
     * @param fields  字段集合
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @param page    页码
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listProjectProfits")
    List<Map<String, Object>> listProjectProfits(@Param("fields") String[] fields,
                                                 @Param("qyName") String qyName,
                                                 @Param("proName") String proName,
                                                 @Param("area") String area,
                                                 @Param("page") Page page,
                                                 @Param("street") String street,
                                                 @Param("beginTime") String beginTime,
                                                 @Param("endTime") String endTime,
                                                 @Param("district") Integer district);

    /**
     * 项目经营状况信息数据数量
     *
     * @param qyName  企业名
     * @param proName 项目名
     * @param area    管理地区
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countProjectProfit")
    int countProjectProfit(@Param("qyName") String qyName,
                           @Param("proName") String proName,
                           @Param("area") String area,
                           @Param("street") String street,
                           @Param("beginTime") String beginTime,
                           @Param("endTime") String endTime,
                           @Param("district") Integer district);

    /**
     * 优良负面信息数据
     *
     * @param fields   字段集合
     * @param qyName   企业名
     * @param proName  项目名
     * @param area     管理地区
     * @param page     页码
     * @param infoType 消息类型(1优良信息，2负面信息)
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listScoreDetails")
    List<Map<String, Object>> listScoreDetails(@Param("fields") String[] fields,
                                               @Param("qyName") String qyName,
                                               @Param("proName") String proName,
                                               @Param("area") String area,
                                               @Param("page") Page page,
                                               @Param("infoType") Integer infoType,
                                               @Param("street") String street,
                                               @Param("beginTime") String beginTime,
                                               @Param("endTime") String endTime,
                                               @Param("district") Integer district);

    /**
     * 优良负面信息数据数量
     *
     * @param qyName   企业名
     * @param proName  项目名
     * @param area     管理地区
     * @param infoType 消息类型(1优良信息，2负面信息)
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countScoreDetail")
    int countScoreDetail(@Param("qyName") String qyName,
                         @Param("proName") String proName,
                         @Param("area") String area,
                         @Param("infoType") Integer infoType,
                         @Param("street") String street,
                         @Param("beginTime") String beginTime,
                         @Param("endTime") String endTime,
                         @Param("district") Integer district);

    /**
     * 企业教育情况数据
     *
     * @param fields     字段集合
     * @param qyName     企业名
     * @param area       管理地区
     * @param page       页码
     * @param department 培训部门
     * @param subject    培训科目
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "listTrains")
    List<Map<String, Object>> listTrains(@Param("fields") String[] fields,
                                         @Param("qyName") String qyName,
                                         @Param("area") String area,
                                         @Param("page") Page page,
                                         @Param("department") String department,
                                         @Param("subject") String subject,
                                         @Param("street") String street,
                                         @Param("beginTime") String beginTime,
                                         @Param("endTime") String endTime,
                                         @Param("district") Integer district);

    /**
     * 企业教育情况数据数量
     *
     * @param qyName     企业名
     * @param area       管理地区
     * @param department 培训部门
     * @param subject    培训科目
     * @return 结果集
     */
    @SelectProvider(type = ExcelProvider.class, method = "countTrain")
    int countTrain(@Param("qyName") String qyName,
                   @Param("area") String area,
                   @Param("department") String department,
                   @Param("subject") String subject,
                   @Param("street") String street,
                   @Param("beginTime") String beginTime,
                   @Param("endTime") String endTime,
                   @Param("district") Integer district);

    /**
     * 获取等级下拉列表
     *
     * @return 等级列表
     */
    @Select("SELECT level FROM `score_composite` GROUP BY level")
    List<String> getDj();
}
